Homicide Summary

Column

The median age for all London homicide victims is 30 (2008 to 2020)

After decling from 2008, the number of homicides in London increased after 2014

Column

Homicide rates are highest in the centre of London - peaking at over 7 victims per 100,000 in City of London (average for 2008 to 2019)

Column

The number of black victims of homicide has grown sharply since 2014 (2008-2019)

Death by knife is the largest and most rapdily growing cause of death (2008-2019)

By Gender and Age

Column

A higher proportion of male homicides are young (2008-2020)

There is a high concentration of male victims at a younger age with a mean age of 33 (2008-2020)

Column

There are larger clusters of female victims near the centre of London (2008 - 2020)

Column

A higher proportion of black homicides are young (2008-2019)

77% of all homicide victims in London are male (2008-2019)

By Ethnicity and Cause of Death

Column

Black victims of homicide are younger than victims from White, Asian or Other ethnicities (2008-2019)

Homicides involving black victims are less likely to get solved in the criminal justice system (2008-2020)

Column

Homicides by victim ethnicity are generally dispersed evenly across London with a higher concentration of Black victims in Eastern boroughs (2008-2020)

Column

Gun homicide victims are younger on average than other victims (2008-2019)

Homicides involving guns are also less likely to get solved in the criminal justice system (2008-2020)

---
title: "London Homicides 2008 to 2020"
author: "David Harrington"
output: 
  flexdashboard::flex_dashboard:
    social: menu
    source_code: embed
---

```{r global, include=FALSE}

library(flexdashboard)
library(knitr)
library(readxl)
library(ggplot2)
library(dplyr)
library(tidyr)
library(tibble)
library(stringr)
library(lubridate)
library(leaflet)
library(leaflet.extras)
library(tidyverse)
library(reshape)
library(ggridges)
library(rgeos)
library(ggmap)
library(maptools)
library(broom)
library(mapproj)
library(htmlwidgets)
library(htmltools)
library(plotly)

    # data import
    
    library(readxl)
    mmap18 <- read_excel("C:/Users/david/OneDrive - RMIT University/Data Visualisation and Communication/London Homicides Project/mmap.xlsx")
    
    
    # clean up the orginal data set and eliminate redundant variables
    
    library(dplyr)
    mmap18 = select(mmap18, -6,-7,-8,-13,-14,-16,-17,-18,-19)
    
    # reorder columns
    mmap18 <- mmap18[ , c(2, 1, 8, 9,5,4,3,10,6,11,7)]  
    
    
    # update column names
    colnames(mmap18) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
    
    # change strings to factors
    mmap18 <- mmap18 %>% mutate_if(is.character, as.factor) 
    
    # import the 2019 murder map data into R
    mmap19 <- read_excel("C:/Users/david/OneDrive - RMIT University/Data Visualisation and Communication/London Homicides Project/Murdermap2019.xlsx")
    
    mmap19 = select(mmap19, -3,-6)
    
    
    mmap19$longitude <- as.numeric(mmap19$longitude)
    
    
    # change strings to factors
    mmap19 <- mmap19 %>% mutate_if(is.character, as.factor) 
    
    colnames(mmap19) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
    
    # import the 2019 murder map data into R
    mmap20 <- read_excel("C:/Users/david/OneDrive - RMIT University/Data Visualisation and Communication/London Homicides Project/Murdermap2020.xlsx")
    
    mmap20 = select(mmap20, -3,-6)
    
    mmap20 <- mmap20 %>% mutate_if(is.character, as.factor) 
    
    colnames(mmap20) <- c("date", "ID", "latitude", "longitude", "ethnicity", "sex", "age", "ageGroup", "weapon", "borough", "status")
    
    
    ##Merge mmap19 and mmap 20 using rbind function
    mmap19_20 = rbind(mmap19,mmap20)
    
    #change the levels for "sex" to align with mmap18
    mmap19_20 <- mmap19_20 %>%
      mutate(sex = fct_recode(sex,
                              "M" = "Male",
                              "F" = "Female")) 
    
    # merge mmap19_20 with mmap18 to create mmap (integrated cases from 2008 to 2020)
    mmap = rbind(mmap18, mmap19_20)
    
    
    # See all levels in weapon variable
    levels(mmap$weapon) 
    
    # Replicate weapon column to enable re-factoring
    mmap2 = cbind(mmap, weapon2=rep(mmap$weapon)) 
    
    
    # Change levels in Weapon column to include just 4 levels Knife, Gun, Assault and Other
    mmap3 <- mmap2 %>% mutate( weapon = fct_recode(weapon,
                                                   "Other" = "Arson",
                                                   "Other" = "Vehicle",
                                                   "Other" = "Drug",
                                                   "Other" = "Poison",
                                                   "Other" = "Unknown",
                                                   "Other" = "Ligature",
                                                   "Other" = "Strangulation",
                                                   "Other" = "Fire",
                                                   "Other" = "Other",
                                                   "Other" = "Blunt Object",
                                                   "Assault" = "None"))
    
    
    
    # clean up the factor names within borough variable to enable the bind with boroughpop (ensure they are exactly the same!)
    mmap33 <- mmap3 %>% mutate(borough = fct_recode(borough, 
                                                    "Westminster" = "City of Westminster",
                                                    "Kingston upon Thames" = "Kingston-upon-Thames",
                                                    "Kingston upon Thames" = "Kingston Upon Thames",
                                                    "Kingston upon Thames" = "Kingston-Upon-Thames",
                                                    "Richmond upon Thames" = "Richmond"))
    
    
    # Replicate date column
    mmap4 = cbind(mmap33, date2=rep(mmap3$date))
    
    
    # create new data frame mmap5 and separate date variable from mmap4 into year, month and day and save them as integers
    mmap5 = separate(mmap4, date2, c("year", "month", "day"), "-") %>%
      mutate_if(is.character, as.integer) 
    
    mmap5 <- mmap5 %>% mutate(status2 = fct_recode(status, 
                                                   "Awaiting Trial" = "Awaiting trial",
                                                   "Awaiting Trial" = "Awaiting Outcome",
                                                   "Solved" = "Solved",
                                                   "Solved" = "Self Defence",
                                                   "Unsolved" = "Suspect dead",
                                                   "Unsolved" = "Unsolved"))
    
    
    
    mmap5 <- mmap5 %>% mutate(ethnicity = fct_recode(ethnicity, 
                                                     "Other" = "Mixed",
                                                     "Black" = "Black",
                                                     "Black" = "Black or Black British",
                                                     "White" = "White",
                                                     "White" = "White or White British",
                                                     "Asian" = "Asian",
                                                     "Asian" = "Asian or Asian British",
                                                     "Other" = "Unknown",
                                                     "Other" = "NA",
                                                     "Other" = "Any Other Ethnic Appearance"))
    
    levels(mmap5$ethnicity)
    
    # read the boroughpop file into R to access borough population data
    boroughpop <- read_excel("boroughpop.xlsx")
    
    
    # change column names in boroughpop
    colnames(boroughpop) = c("borough", "population")
    
    # join mmap5 and boroughpop data frames using "borough" 
    mmap6 <- left_join(mmap5, boroughpop, by = "borough")
    
    
    # make bourough a factor variable
    mmap6$borough <- as.factor(mmap6$borough)
    
    
    # create new variable for counting homicides by borough and homicides per 100,000 population by borough
    mmap6_sum <- mmap6 %>% select(borough, population) %>% group_by(borough) %>% mutate(count = n(), population = population, homicide_rate = (count*100000)/11/population) %>% distinct()
    
    # create mmap 7 by filtering mmap5 to just include full year data to end of calendar 2019
    mmap7 <- mmap6 %>% filter(year != "2020")
    
    
    mmap7 <-data.frame(mmap7)
    
    # remove NA cases for ethicity
    mmap8 <- mmap7 %>% filter(ethnicity != "NA")
    
    # save mmap6_sum as data frame and name the data frame mmap9                                                                               
    mmap9 <- as.data.frame(mmap6_sum)
    
    # create new data frame mmap10 with just borough and homicide rate variables
    mmap10 <- mmap9 %>% select(borough, homicide_rate)
    
    # round the homicide_rate variable to 2 decimal places
    mmap10$homicide_rate <- round(mmap10$homicide_rate, 2)
    
    # arrange the data frame based on homicide rate variable descending order
    mmap10 <- mmap10 %>% arrange(desc(mmap10$homicide_rate)) 
    
    
    mmap7$year <- as.factor(mmap7$year)   

    # calculate sum borough population based on the 2016 ONS data for boroughs
GreaterLondonPop <- sum(boroughpop$population)
GreaterLondonPop

# create vector for Greater London Population for 2008 to 2019
 GreaterLondonPopMillions <- c(7.8, 7.9, 8.0, 8.15, 8.25, 8.35, 8.5, 8.7, 8.82, 8.85, 8.9, 9.0)
 
# Greater London Population in 100,000s
GreaterLondon <- GreaterLondonPopMillions*10

# Greater London total homicides

LondonHomicides <- c(155, 130, 128, 121, 103, 113, 90, 120, 107, 130, 131, 149)

Year <- c(2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019)

# merge vectors into a data frame

London <- data.frame(Year, LondonHomicides, GreaterLondon)

London


# Number of homicides per 100,000 population, 2008-2019

LondonHomicideRate <- London %>% mutate(Homicide_Rate = LondonHomicides/GreaterLondon)

LondonHomicideRate$Homicide_Rate <- round(LondonHomicideRate$Homicide_Rate,2)

LondonHomicideRate$Year <- as.factor(LondonHomicideRate$Year)

str(LondonHomicideRate)

sex <- table(mmap5$sex) # Victim gender table
addmargins(sex) # Plus totals

# create new data frame to show ageGroup data by year
ageyear <- mmap7 %>% 
  select(ageGroup, year) %>%
  group_by(ageGroup, year) %>%
  tally() %>%
  spread(ageGroup, n) 


# calculate total homicides per ageGroup across 2008 to 2019
homicidesA <- sum(ageyear$`A. Child 0-6`, na.rm= TRUE)
homicidesB <- sum(ageyear$`B. Child 7-12`, na.rm= TRUE)
homicidesC <- sum(ageyear$`C. Teen 13-16`, na.rm= TRUE)
homicidesD <- sum(ageyear$`D. Teen 17-19`, na.rm= TRUE)
homicidesE <- sum(ageyear$`E. Adult 20-24`, na.rm= TRUE)
homicidesF <- sum(ageyear$`F. Adult 25-34`, na.rm= TRUE)
homicidesG <- sum(ageyear$`G. Adult 35-44`, na.rm= TRUE)
homicidesH <- sum(ageyear$`H. Adult 45-54`, na.rm= TRUE)
homicidesI <- sum(ageyear$`I. Adult 55-64`, na.rm= TRUE)
homicidesJ <- sum(ageyear$`J. Adult 65 over`, na.rm= TRUE)

# consolidate total homicides per ageGroup across 2008 to 2019 into a new vector homicides_ageGroup
homicides_ageGroup <- c(homicidesA, homicidesB, homicidesC, homicidesD, homicidesE, homicidesF, homicidesG, homicidesH, homicidesI, homicidesJ)

# create vector agegp with unique values for the variable "ageGroup" in mmap5
agegp <- unique(mmap5$ageGroup)

# refactor to order the values for the variable "ageGroup" from youngest to oldest
agegp <- factor(c("A. Child 0-6", "B. Child 7-12", "C. Teen 13-16", "D. Teen 17-19", "E. Adult 20-24", "F. Adult 25-34","G. Adult 35-44","H. Adult 45-54","I. Adult 55-64","J. Adult 65 over"))

# create vector to calculate average homicides per year over 11 years from 2008 to 2019
homicides_ageGroup_avg <- homicides_ageGroup/11

# create population vector by age group - Source: ONS small area population estimates mid-2016 (latest ONS survey for UK)
popn <- c(872040, 659384, 374989, 278134, 557975, 1654605, 1408946, 1151408, 828359, 1039161) 

# create homicide-rate2 vector
homicide_rate2  <- homicides_ageGroup_avg / popn * 100000 


# Create a data frame from vectors
mmap11 <- data.frame(agegp, round(homicide_rate2,2)) 

colnames(mmap11) <- c("Age_Group", "Homicide_Rate")

# calculate mean and median age for all homicides in London 2008-2020
meanAge <- mean(mmap5$age)
meanAge

medianAge <- median(mmap5$age)
medianAge

# Trends in Status

## create tables showing probability of being solved given weapon, ethnicity and borough

# by weapon type
status <- table(mmap5$weapon, mmap5$status, dnn = c("weapon", "status"))
status

statusProp <- prop.table(status, 1)
statusProp

# save as data frame
weaponStatus <- data.frame(statusProp)

# filter to just include probability of being solved
weaponStatus1 <- weaponStatus %>% filter(status == "Solved")

# change to percent
weaponStatus1$percent <- round(weaponStatus1$Freq,2)*100

mmap13 <- weaponStatus1 %>% arrange(weaponStatus1$percent)

mmap13$percent <- as.integer(mmap13$percent)

p1 <- ggplot(mmap7, aes(x = year)) +
  geom_bar(stat='count', fill = "navyblue", color = "white") +
  geom_label(stat = "count", aes(label = ..count..,y = ..count..), size = 3) +
  labs(x = "Year", y = "Number of Homicides", title = "London homicides, 2008-2019")+
  theme_bw()

p3 <- ggplot(LondonHomicideRate, aes(x= Year, y=Homicide_Rate)) +
geom_bar(stat="identity", fill="navyblue", color = "white")+
  geom_label(aes(label = Homicide_Rate, vjust = 1),size = 3)+
  labs(x = "Year", y = "Rate", title = "London homicide rate per 100,000")+
  theme_bw()

# by ethnicity

levels(mmap8$ethnicity)

status2 <- table(mmap8$ethnicity, mmap8$status, dnn = c("ethnicity", "status"))
status2

status2Prop <- round(prop.table(status2, 1),2)
status2Prop

# save as data frame
ethnicityStatus <- data.frame(status2Prop)


# filter to just include probability of being solved

ethnicityStatus1 <- ethnicityStatus %>% filter(status == "Solved")

# change to percent
ethnicityStatus1$percent <- round(ethnicityStatus1$Freq,2)*100

mmap14 <- ethnicityStatus1 %>% arrange(ethnicityStatus1$percent)

# by ageGroup

levels(mmap8$ageGroup)

status4 <- table(mmap8$ageGroup, mmap8$status, dnn = c("ageGroup", "status"))
status4

status4Prop <- round(prop.table(status4, 1),2)
status4Prop

# save as data frame
AgeGroupStatus <- data.frame(status4Prop)


# filter to just include probability of being solved

AgeGroupStatus1 <- AgeGroupStatus %>% filter(status == "Solved")

# change to percent
AgeGroupStatus1$percent <- round(AgeGroupStatus1$Freq,2)*100


# by location
status3 <- table(mmap5$borough, mmap5$status, dnn = c("borough", "status"))
status3

status3Prop <- prop.table(status3, 1)
status3Prop

# save as data frame
boroughStatus <- data.frame(status3Prop)

# filter to just include probability of being solved

boroughStatus1 <- boroughStatus %>% filter(status == "Solved")

# change to percent
boroughStatus1$percent <- round(boroughStatus1$Freq,2)*100


# Install ggplot2 mapping packages

library(rgeos)
library(ggmap)
library(maptools)
library(broom)
library(mapproj)


# create Leaflet interactive cloropeth chart for Homicide Rate

# read shp file for just London boroughs
London_Ward2 <- readShapeSpatial("London_Borough_Excluding_MHW.shp")

# convert coordinates into lat long degrees
proj4string(London_Ward2) <- CRS("+init=epsg:27700")
London_Ward2.wgs84 <- spTransform(London_Ward2, CRS("+init=epsg:4326"))


library(leaflet)

# For Leaflet choropleth maps, we need to use a SpatialPolygonDataFrame

class(London_Ward2.wgs84)
names(London_Ward2.wgs84)

# Rename the borough variable in mmap10 to "NAME" to match the "SpatialPolygonsDataFrame" file London_Ward2.wgs84

names(mmap10)[names(mmap10) == "borough"] <- "NAME"

str(mmap10)

mmap10 <- mmap10 %>% mutate(NAME = fct_recode(NAME, 
                                                        
                             "City of London" = "City and County of the City of London",
                            
                           "Westminster" = "City of Westminster"))  

levels(mmap10$NAME)

# merge mmap data into London_Ward.wgs84 SpatialPolygonsDataFrame using "DISTRICT"
merge.mmap10 <- sp::merge(London_Ward2.wgs84, mmap10, by = "NAME", duplicateGeoms = TRUE)


# create a discrete colour scale based on quantiles for five levels

bins <- quantile(
  mmap10$homicide_rate,
  probs = seq(0,1,.2), names = FALSE, na.rm = TRUE)
bins



```
Homicide Summary {data-orientation=Column}
=======================================================================

Column {data-width=600}
-----------------------------------------------------------------------

### The median age for all London homicide victims is 30 (2008 to 2020)

```{r}
p6 <- ggplot(mmap5, aes(x = age))+ 
  geom_density(fill = "red", alpha = 0.5)+ 
  geom_histogram(colour = "white", fill = "navyblue", aes(age, ..density..), alpha = 0.5, bins = 100)+
  labs(x = "Victim Age", y = "Proportion of Homicides")+
  geom_vline(xintercept= median(mmap7$age)) +
  annotate("text",label = "Mean = 34.6",x = 45, y = 0.04, colour = "red") +
  geom_vline(xintercept= mean(mmap7$age),linetype=2) +
  annotate("text",label = "Median = 30.0",x = 41, y = 0.035, colour = "red")+
  scale_x_continuous(limits = c(0, 100))+
   theme_bw()
ggplotly(p6)
```

### After decling from 2008, the number of homicides in London increased after 2014

```{r}

p1 <- ggplot(mmap7, aes(x = year)) +
  geom_bar(stat='count', fill = "navyblue", color = "white") +
  geom_label(stat = "count", aes(label = ..count..,y = ..count..), size = 3) +
  labs(x = "Year", y = "Number of Homicides")+
  theme_bw()
ggplotly(p1)
```

```
```

Column {data-width=500}
-----------------------------------------------------------------------

### Homicide rates are highest in the centre of London - peaking at over 7 victims per 100,000 in City of London (average for 2008 to 2019)

```{r}
  pal <- colorBin(
    "YlOrRd",
    domain = mmap10$homicide_rate,
    bins = bins
  )

# add the colour scale to the choropleth map.
labels <- sprintf(
  "%s
%g homicide_rate",
  merge.mmap10$NAME,
  merge.mmap10$homicide_rate
) %>% lapply(htmltools::HTML)

title <- tags$div(
  HTML('

London Homicide Rate by Borough

') ) p3 <- leaflet(merge.mmap10) %>% setView(lng = -0.118092 , lat = 51.509865, zoom = 10) p3 %>% addPolygons( fillColor = ~pal(homicide_rate), weight = 2, opacity = 0.5, color = "black", dashArray = "3", fillOpacity = 0.7, highlight = highlightOptions( weight = 5, color = "#0000FF", dashArray = "", fillOpacity = 0.7, bringToFront = TRUE), label = labels, labelOptions = labelOptions( style = list("font-weight" = "normal", padding = "3px 8px"), textsize = "15px", direction = "auto")) %>% addLegend(pal = pal, values = ~homicide_rate, opacity = 0.7, title = "Homicide Rate", position = "bottomright") %>% addControl(title, position = "topright") %>% setView(lng=-0.1, lat=51.51, zoom=10) %>% addProviderTiles("Esri.NatGeoWorldMap") ``` Column ----------------------------------------------------------------------- ### The number of black victims of homicide has grown sharply since 2014 (2008-2019) ```{r} p16 <- ggplot(mmap8, aes(x = year, fill = ethnicity)) + geom_density(stat='count', alpha = 0.6, colour = "black") + scale_x_continuous(breaks = c(2008:2019)) + scale_fill_brewer(palette = "Set1") + labs(x = "Calendar Year", y = "Number of Homicides", fill = "legend")+ theme_bw() ggplotly(p16) ``` ### Death by knife is the largest and most rapdily growing cause of death (2008-2019) ```{r} p17 <- ggplot(mmap8, aes(x = year, fill = weapon)) + geom_density(stat='count', alpha = 0.6, colour = "black") + scale_x_continuous(breaks = c(2008:2020)) + scale_fill_brewer(palette = "Set1") + labs(x = "Calendar Year", y = "Number of Homicides", fill = "legend")+ theme_bw() ggplotly(p17) ``` ``` ``` By Gender and Age {data-orientation=Column} ======================================================================= Column {data-width=550} ----------------------------------------------------------------------- ### A higher proportion of male homicides are young (2008-2020) ```{r} p9 <- ggplot(mmap5, aes(x = age, fill = sex)) + geom_density(alpha = 0.8)+ scale_fill_brewer(palette = "Set1")+ labs(fill = "Legend")+ scale_x_continuous("Victim Age")+ scale_y_continuous("Proportion of Homicides")+ theme_bw() ggplotly(p9) ``` ### There is a high concentration of male victims at a younger age with a mean age of 33 (2008-2020) ```{r} p10 <- ggplot(data = mmap5, aes(x = sex, y = age)) + geom_boxplot(outlier.shape = NA) + geom_jitter(alpha = 1/5) + ylab("age of victim") + stat_summary(fun.y="mean", colour="red", geom="point",shape = 16, size = 4) + theme_minimal() ggplotly(p10) ``` ``` ``` Column {data-width=500} ----------------------------------------------------------------------- ### There are larger clusters of female victims near the centre of London (2008 - 2020) ```{r} femaleVictims <- mmap5 %>% filter(sex == 'F') femaleVictims %>% # Map showing all point data leaflet() %>% setView(lng =-0.1, lat=51.51, zoom=10) %>% addProviderTiles(providers$Esri.NatGeoWorldMap) %>% addScaleBar %>% addCircleMarkers(lng = ~longitude, lat = ~latitude, popup = ~paste0("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", borough), radius = 5, clusterOptions = markerClusterOptions) ``` ``` ``` Column ----------------------------------------------------------------------- ### A higher proportion of black homicides are young (2008-2019) ```{r} p13 <- ggplot(mmap8, aes(x = age, fill = ethnicity)) + geom_density(alpha = 0.6)+ scale_fill_brewer(palette = "Set1")+ labs(fill = "Legend")+ scale_x_continuous("Victim Age")+ scale_y_continuous("Proportion of Homicides")+ theme_bw() ggplotly(p13) ``` ### 77% of all homicide victims in London are male (2008-2019) ```{r} p18 <- ggplot(mmap8, aes(x = year, fill = sex)) + geom_density(stat='count', alpha = 0.6, colour = "black") + scale_x_continuous(breaks = c(2008:2020)) + scale_fill_brewer(palette = "Set1") + labs(x = "Calendar Year", y = "Number of Homicides", fill = "legend")+ theme_bw() ggplotly(p18) ``` ``` ``` By Ethnicity and Cause of Death {data-orientation=Column} ======================================================================= Column {data-width=600} ----------------------------------------------------------------------- ### Black victims of homicide are younger than victims from White, Asian or Other ethnicities (2008-2019) ```{r} p14 <- ggplot(data = mmap8, aes(x = reorder(ethnicity, age, "mean"), y = age), na.rm = TRUE)+ geom_boxplot(outlier.shape = NA) + geom_jitter(alpha = 1/5) + ylab("Age of victim") + xlab("Ethnicity")+ stat_summary(fun="mean", colour="red", geom="point",shape = 16, size = 4) + theme_minimal() ggplotly(p14) ``` ### Homicides involving black victims are less likely to get solved in the criminal justice system (2008-2020) ```{r} p23 <- ggplot(mmap14, aes(x= reorder(ethnicity, percent), y=percent))+ geom_bar(stat="identity", fill="navyblue", color = "black")+ coord_flip()+ labs(x = "Ethnicity", y = "Percent Solved")+ theme_minimal() ggplotly(p23) ``` ``` ``` Column {data-width=550} ----------------------------------------------------------------------- ### Homicides by victim ethnicity are generally dispersed evenly across London with a higher concentration of Black victims in Eastern boroughs (2008-2020) ```{r} pal2 <- colorFactor(palette = c("darkgreen", "purple", "blue", "red"), levels = c("Black", "White", "Asian", "Other")) # Creating a 4 colour palette black <- mmap5 %>% filter(ethnicity == "Black") # Grouping layers - black white <- mmap5 %>% filter(ethnicity == "White") # Grouping layers - white asian <- mmap5 %>% filter(ethnicity == "Asian") # Grouping layers - asian other <- mmap5 %>% filter(ethnicity == "Other") # Grouping layers - other mmap5 %>% leaflet() %>% setView(lng=-0.1, lat=51.51, zoom=10) %>% addProviderTiles("Esri.NatGeoWorldMap") %>% addScaleBar(position = "bottomleft") %>% addCircleMarkers(data = black, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "Black", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addCircleMarkers(data = white, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "White", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addCircleMarkers(data = asian, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "Asian", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addCircleMarkers(data = other, lng = ~longitude, lat = ~latitude, radius = 2, color = ~pal2(ethnicity), group = "Other", popup = ~paste("", ID, "", "
", date, "
", age, "
", sex, "
", weapon, "
", status)) %>% addLegend(position = "bottomright", pal = pal2, values = c("Black", "White", "Asian", "Other"), title = "Legend") %>% addLayersControl( overlayGroups = c("Black", "White", "Asian", "Other")) ``` ``` ``` Column ----------------------------------------------------------------------- ### Gun homicide victims are younger on average than other victims (2008-2019) ```{r} p19 <- ggplot (data = mmap8, aes(x = reorder(weapon, age, "mean"), y = age), na.rm = TRUE)+ geom_boxplot()+ geom_boxplot(outlier.shape = NA) + geom_jitter(alpha = 1/5) + ylab("Age of victim") + xlab("Cause of Death")+ stat_summary(fun="mean", colour="red", geom="point",shape = 16, size = 4) + theme_minimal() ggplotly(p19) ``` ### Homicides involving guns are also less likely to get solved in the criminal justice system (2008-2020) ```{r} p22 <- ggplot(mmap13, aes(x= reorder(weapon, percent), y=percent))+ geom_bar(stat="identity", fill="navyblue", color = "black")+ coord_flip()+ labs(x = "Weapon", y = "Percent Solved")+ theme_minimal() ggplotly(p22) ```